package com.itqf.proxy;

import com.itqf.face.Face;
import com.itqf.person.GaoCuiLan;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * projectName: springframeworkgp8
 *
 * @author: 赵伟风
 * time: 2021/8/3 16:33
 * description:
 */
public class UserProxy {

    public static void main(String[] args) {

        //目标对象
        Face gao = new GaoCuiLan();

        /**
         * 生成代理对象
         *   参数1: 目标对象类加载器
         *   参数2: 目标对象的接口
         *   参数3: 拦截处理器
         */
        Face sunwukong = (Face) Proxy.newProxyInstance(gao.getClass().getClassLoader(), gao.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * 生成代理对象方法
             * @param proxy  代理对象
             * @param method 目标方法
             * @param args 方法的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /**
                 * 注意: 不要在invoke方法中,触发任何代理对象的方法!
                 *       只要触发就死循环了! 栈溢出!
                 *
                 *       目标对象方法调用!
                 *       增强的代码!
                 */
                System.out.println("猴子来了!!");
                method.invoke(gao,args); //每次执行代理对象,先要调用目标对象的方法
                System.out.println("猴子走了!!");
                System.out.println(proxy);
                return null;
            }
        });


        /**
         * 调用代理对象的方法会触发 invoke方法!
         */

        sunwukong.eat();



    }
}
